/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tida.servir.components;

/**
 *
 * @author Jurguen
 */
import com.tida.servir.entities.ConfiguracionAcceso;
import com.tida.servir.entities.DatoAuxiliar;
import com.tida.servir.entities.Funcionario;
import com.tida.servir.entities.LkBusquedaFuncionario;
import com.tida.servir.entities.Perfilporusuario;
import com.tida.servir.entities.Usuario;
import com.tida.servir.services.GenericSelectModel;
import helpers.Helpers;
import helpers.ServicioReniec;
import java.util.List;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.Request;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

public class ComponenteFuncionario {

    @Parameter
    private Zone _zone;
    @Parameter
    private Zone _zoneOtro;
    @Parameter(defaultPrefix = BindingConstants.LITERAL)
    @Property
    private String _zoneName;
    @Parameter(defaultPrefix = BindingConstants.LITERAL)
    @Property
    private String _zoneNameOtro;
    @Parameter(required = true)
    private Funcionario funcionarioComponente;
    @Parameter(value = "false")
    @Property
    private Boolean esEntidadExterna;
    @Inject
    private Session session;
    @SessionState
    private Usuario _usuario;
    @Property
    @Persist
    private Boolean mostrarnuevof;
    @Property
    @Persist
    private Boolean mostrarautoridad;
    private int elemento = 0;
    @Property
    @Persist
    private Boolean mostrarlista;
    @Property
    @Persist
    private Boolean guardarFuncionario;
    @Property
    @Persist
    private int maxlength;
    @Persist
    private String regeVali;
//    @InjectComponent
//    private TextField autoridad_nrodocumento;
//    @Inject
//    private FieldValidatorSource fieldValidatorSource;
    @Property
    @Persist
    private Boolean buscarReniec;
    @Property
    @Persist
    private Boolean ingresaDI;
    @Property
    @Persist
    private Boolean buscaReniec;
    @Property
    @Persist
    private String bnomautoridad;
    @Persist
    @Property
    private String nroautoridad;
    @Property
    @Persist
    private Boolean autoridad;
    @Property
    @Persist
    private Funcionario nuevofuncionario;
    @Inject
    private PropertyAccess _access;
    @Persist
    @Property
    private Boolean veditar;
    @Persist
    @Property
    private Boolean veditarCargo;
    @InjectComponent
    private Zone autoridadmodalZone;
    @Component(id = "formulariomensajespi")
    private Form formulariomensajespi;
    @Component(id = "formnuevaautoridad")
    private Form formnuevaautoridad;
    @InjectComponent
    private Zone mensajesPIZone;
    @Property
    @Persist
    private LkBusquedaFuncionario bfuncionario;
    @Property
    @Persist
    Perfilporusuario perfilporusuario;
    @Inject
    private Request _request;

    // inicio de la pagina
    @Log
    void setupRender() {
        formulariomensajespi.clearErrors();
        mostrarlista = false;
        mostrarnuevof = false;
        autoridad = false;
        regeVali = "";

        buscarReniec = false; // Para controlar si realizó una búsqueda en reniec
        nuevofuncionario = new Funcionario();
        Criteria c = session.createCriteria(Perfilporusuario.class);
        perfilporusuario = new Perfilporusuario();
        c.add(Restrictions.eq("usuarioId", Long.valueOf(_usuario.getId().toString())));
        if (!c.list().isEmpty()) {
            perfilporusuario = (Perfilporusuario) c.list().get(0);
        }

        if (perfilporusuario == null) {
            System.out.println("perfilporusuario NULL");
        } else {
            System.out.println("perfilporusuario NO NULL");
        }

        if (esEntidadExterna == null) {
        } else {
            if (!esEntidadExterna) {
                buscaReniec = true; // Para habilitar el boton de buscar en reniec
                if (nuevofuncionario.getDocumentoidentidad() == null) {
                    c = session.createCriteria(DatoAuxiliar.class);
                    c.add(Restrictions.eq("codigo", 1L));
                    c.add(Restrictions.eq("nombreTabla", "DOCUMENTOIDENTIDAD"));
                    nuevofuncionario.setDocumentoidentidad((DatoAuxiliar) c.uniqueResult());
                    regeVali = "regexp=^[0-9]{8}$";
                    maxlength = 8;
                }
            } else {
                buscaReniec = false; // Para habilitar el boton de buscar en reniec
                ingresaDI = true;
            }
        }
    }

    @Log
    public List<LkBusquedaFuncionario> getFuncionarios() {
        List<LkBusquedaFuncionario> listaFuncionario;
        Criteria c = session.createCriteria(LkBusquedaFuncionario.class);
        c.add(Restrictions.eq("flg_usuario", false));
        if (bnomautoridad != null) {
            c.add(Restrictions.disjunction().add(Restrictions.like("nombrefuncionario", "%" + bnomautoridad + "%").ignoreCase()).add(Restrictions.like("nombrefuncionario", "%" + bnomautoridad.replaceAll("ñ", "n") + "%").ignoreCase()).add(Restrictions.like("nombrefuncionario", "%" + bnomautoridad.replaceAll("n", "ñ") + "%").ignoreCase()));
        }
        listaFuncionario = c.list();
        nroautoridad = Integer.toString(listaFuncionario.size());
        return listaFuncionario;
    }

    @Log
    Object onActionFromSeleccionaFuncionario(LkBusquedaFuncionario fun) {
        Funcionario sele = new Funcionario();
        sele = (Funcionario) session.load(Funcionario.class, fun.getId());
        funcionarioComponente = sele;
        return new MultiZoneUpdate(_zoneName, _zone.getBody()).add(_zoneNameOtro, _zoneOtro.getBody());
    }

    @Log
    public GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidadauto() {
        List<DatoAuxiliar> list;
//        if (perfilporusuario == null) {
//            Criteria c = session.createCriteria(Perfilporusuario.class);
//            perfilporusuario = new Perfilporusuario();
//            c.add(Restrictions.eq("usuarioId", Long.valueOf(_usuario.getId().toString())));
//            if (!c.list().isEmpty()) {
//                perfilporusuario = (Perfilporusuario) c.list().get(0);
//            }
//        }
        if (perfilporusuario.getPerfilId() == 3) {
            list = Helpers.getDatoAuxiliarLista("DOCUMENTOIDENTIDAD", 1L, session);
        } else {
            list = Helpers.getDatoAuxiliar("DOCUMENTOIDENTIDAD", null, 0, session);
        }
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "abrev", "id", _access);
    }

    @Log
    void onSelectedFromNuevautoridad() {
        elemento = 4;
    }

    @Log
    Object onSuccessFromformbusquedaautoridad() {
        if (elemento == 4) {
            onResetNuevo();
        } else {
            mostrarlista = true;
        }
        return autoridadmodalZone.getBody();
    }

    @Log
    Object onCancelNuevo() {
        mostrarnuevof = false;
        formulariomensajespi.clearErrors();
        return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
    }

    @Log
    Object onResetNuevo() {
        mostrarnuevof = true;
        mostrarautoridad = false;
        ingresaDI = false;
        veditar = true;
        veditarCargo = true;
        guardarFuncionario = false;
        nuevofuncionario = new Funcionario();
        formulariomensajespi.clearErrors();
        if (perfilporusuario.getPerfilId() < 3 && esEntidadExterna) {
            veditar = false;
            guardarFuncionario = true;
            veditarCargo = false;
            buscaReniec = false;
        } else {
            buscaReniec = true;
        }
        //return autoridadmodalZone.getBody();
        return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
    }

//    @Log
//    void onSelectedFromBuscarReniec() {
//        buscarReniec = true;
//        veditarCargo = false;
//    }
    @Log
    Boolean onValidaDocumento() {
        if (nuevofuncionario.getDocumentoidentidad() == null) {
            formulariomensajespi.recordError("Ingrese tipo de documento de identidad.");
            return false;//new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
        }
        if (nuevofuncionario.getNroDocumento() == null || nuevofuncionario.getNroDocumento().length() == 0 || nuevofuncionario.getNroDocumento().trim().equals("")) {
            formulariomensajespi.recordError("Ingrese número de documento de identidad.");
            return false;//new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
        }
        if (nuevofuncionario.getDocumentoidentidad().getCodigo() == 1) {
            if (nuevofuncionario.getNroDocumento().length() < 8 || nuevofuncionario.getNroDocumento().length() > 8) {
                formulariomensajespi.recordError("El número de documento debe tener 8 dígitos.");
                return false;//new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
            }
        } else {
            if (nuevofuncionario.getNroDocumento().length() < 12 || nuevofuncionario.getNroDocumento().length() > 12) {
                formulariomensajespi.recordError("El número de documento debe tener 12 dígitos.");
                return false;//new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
            }
        }
        return true;
    }

    @Log
    Object onSuccessFromFormBuscaDocumento() {
        Criteria c;
        veditarCargo = false;
        formulariomensajespi.clearErrors();

        if (!onValidaDocumento()) {
            return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
        }
        List<Funcionario> busqueda = getFuncionario(nuevofuncionario.getDocumentoidentidad().getId(), nuevofuncionario.getNroDocumento());
        if (busqueda.size() > 0) {
            nuevofuncionario.setNombres(busqueda.get(0).getNombres());
            nuevofuncionario.setApellidoPaterno(busqueda.get(0).getApellidoPaterno());
            nuevofuncionario.setApellidoMaterno(busqueda.get(0).getApellidoMaterno());
//            nuevofuncionario.setEmail(busqueda.get(0).getEmail());
//            nuevofuncionario.setTelefono(busqueda.get(0).getTelefono());
            nuevofuncionario.setDen_cargo(busqueda.get(0).getDen_cargo());
            veditarCargo = false;
        } else {
            c = session.createCriteria(ConfiguracionAcceso.class);
            ConfiguracionAcceso parametro = (ConfiguracionAcceso) c.uniqueResult();

            nuevofuncionario.setDen_cargo("");
            if (parametro.getUseReniec() == 0) {
                nuevofuncionario.setApellidoPaterno("NO USA");
                nuevofuncionario.setApellidoMaterno("RENIEC");
                nuevofuncionario.setNombres("BUSQUEDA");
                guardarFuncionario = true;
                ingresaDI = true;
            } else {
                // VERIFICACION DE LOS PARAMETROS CON RESPECTO AL NRO DE PETICIONES TOTALES
                System.out.println("NRO CONSULTAS - EN TOTAL " + parametro.getNroConsultasActuales());
                if (parametro.getNroConsultasActuales() == null || parametro.getNroConsultasActuales() == 0) {
                    formulariomensajespi.recordError("Se superaron el # de consultas al service por el dia de hoy");
                    return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
                }
                // VERIFICACION DE LOS PARAMETROS CON RESPECTO AL NRO DE PETICIONES (ENTIDAD)        
                System.out.println("NRO CONSULTAS - PARA LA ENTIDAD " + _usuario.getEntidad().getPeticiones_ws_Reniec());
                if (_usuario.getEntidad().getPeticiones_ws_Reniec() == null || _usuario.getEntidad().getPeticiones_ws_Reniec() == 0) {
                    formulariomensajespi.recordError("Se superaron el # de consultas al service para la entidad por el dia de hoy");
                    return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
                }
                // BUSQUEDA EN EL WEB SERVICE
                try {
                    ServicioReniec treniec = new ServicioReniec();
                    treniec.obtenerToken();
                    if (treniec.validarToken(session) == true) {
                        System.out.println("BUSCAR DNI");
                        //  Buscamos DNI
                        List<String> result = treniec.obtenerResultado(nuevofuncionario.getNroDocumento());

                        // DISMINUCION DE NRO DE PETICIONES
                        _usuario.getEntidad().setPeticiones_ws_Reniec(_usuario.getEntidad().getPeticiones_ws_Reniec() - 1);
                        session.saveOrUpdate(_usuario.getEntidad());
                        parametro.setNroConsultasActuales(parametro.getNroConsultasActuales() - 1);
                        session.saveOrUpdate(parametro);
                        if (treniec.validarEstadoConsulta(result.get(0), session) == true) {
                            // VALIDACIONES PRE CARGA DE LA ENTIDAD 
//                            Date fechaInicial, fechaWS;
//                            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
//                            fechaInicial = formatoFecha.parse(fechacaducidad);
//                            System.out.println("EXC " + result.get(1) + result.get(18) + result.get(14));
//
//                            if (!result.get(18).equals("")) {
//                                // validacion si la persona no tiene fecha de caducidad (si ha fallecido la persona)
//                                formatoFecha = new SimpleDateFormat("yyyyMMdd");
//                                fechaWS = formatoFecha.parse(result.get(18));
//                                System.out.println("EXC " + fechaInicial);
//                                System.out.println("EXC " + fechaWS);
//
//                                if (!fechaInicial.equals(fechaWS)) {
//                                    //formulariomensajes.recordError("Fecha de Caducidad Incorrecta"); // MENSAJES DE ERROR                         
//                                    return autoridadmodalZone.getBody();
//                                }
//                            } else {
//                                //formulariomensajes.recordError("No se puede registrar a una persona que ha fallecido"); // MENSAJES DE ERROR                         
//                                return autoridadmodalZone.getBody();
//                            }

                            nuevofuncionario.setApellidoPaterno(result.get(1));
                            nuevofuncionario.setApellidoMaterno(result.get(2));
                            nuevofuncionario.setNombres(result.get(4));
                        } else {
                            System.out.println(treniec.mensajeError);
                            formulariomensajespi.recordError(treniec.mensajeError);
                            //return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
                        }
                    } else {
                        System.out.println(treniec.mensajeError);
                        formulariomensajespi.recordError(treniec.mensajeError);
                        //return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
                    }
                } catch (Exception ex) {
                    System.out.println(ex.toString());
                    System.out.println(ex.getCause());
                    //return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
                }
                guardarFuncionario = true;
                ingresaDI = true;
                //buscarReniec = false;
            }
        }
        return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
    }

    @Log
    @CommitAfter
    Object onSuccessFromformnuevaautoridad() {

        Boolean validaDocumento = true;
        formulariomensajespi.clearErrors();
        // No valida documento si es perfil Servir o Sistema y el tipo de sancion permites funcionarios externos
        if (perfilporusuario.getPerfilId() < 3 && esEntidadExterna) {
            validaDocumento = false;
        }
        if (validaDocumento || nuevofuncionario.getDocumentoidentidad() != null) {
            if (!onValidaDocumento()) {
                return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
            }
        }
        if (nuevofuncionario.getApellidoPaterno() == null || nuevofuncionario.getApellidoPaterno().length() == 0) {
            formulariomensajespi.recordError("Ingrese Apellido Paterno del funcionario.");
            return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
        }
        if (nuevofuncionario.getApellidoMaterno() == null || nuevofuncionario.getApellidoMaterno().length() == 0) {
            formulariomensajespi.recordError("Ingrese Apellido Materno del funcionario.");
            return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
        }
        if (nuevofuncionario.getNombres() == null || nuevofuncionario.getNombres().length() == 0) {
            formulariomensajespi.recordError("Ingrese Nombres del funcionario.");
            return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
        }
        if (nuevofuncionario.getDen_cargo() == null || nuevofuncionario.getDen_cargo().length() == 0) {
            formulariomensajespi.recordError("Ingrese Cargo del funcionario.");
            return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
        }

        if (buscarReniec) {
        } else {
            formulariomensajespi.clearErrors();
//            c = session.createCriteria(LkBusquedaFuncionario.class);
//            c.add(Restrictions.eq("nroDocumento", nuevofuncionario.getNroDocumento()));
//            if (!c.list().isEmpty()) {
//                formulariomensajespi.recordError("Ya existe un funcionario registrado con el número de documento ingresado.");
//                return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
//            }
            bnomautoridad = nuevofuncionario.getApellidoPaterno() + ' ' + nuevofuncionario.getApellidoMaterno() + ' ' + nuevofuncionario.getNombres();
            nuevofuncionario.setFlg_usuario(false);
            session.saveOrUpdate(nuevofuncionario);
            session.flush();
            nuevofuncionario = new Funcionario();
            mostrarnuevof = false;
            mostrarlista = true;
            mostrarnuevof = false;
        }
        return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
    }

//    public org.apache.tapestry5.FieldValidator getValidator() {
//        //return new FieldValidator().getValidator(nrodocumento, regeVali);
//        Criteria c;
////        if (nuevofuncionario.getDocumentoidentidad() == null) {
////            c = session.createCriteria(DatoAuxiliar.class);
////            c.add(Restrictions.eq("codigo", 1L));
////            c.add(Restrictions.eq("nombreTabla", "DOCUMENTOIDENTIDAD"));
////            nuevofuncionario.setDocumentoidentidad((DatoAuxiliar) c.uniqueResult());
////            regeVali = "regexp=^[0-9]{8}$";
////            maxlength = 8;
////        }
//        return fieldValidatorSource.createValidators(autoridad_nrodocumento, regeVali);
//    }
    @Log
    Object onValueChangedFromDocumentoIdentidad(DatoAuxiliar dato) {
        validaTipoDocumento(dato);
        return autoridadmodalZone.getBody();
    }

    @Log
    Object onValueChangedFromDocumentoIdentidadExterno(DatoAuxiliar dato) {
        validaTipoDocumento(dato);
        return autoridadmodalZone.getBody();
    }

    @Log
    void validaTipoDocumento(DatoAuxiliar dato) {
        nuevofuncionario.setNroDocumento("");
        if (dato != null) {
            ingresaDI = false;
            if (dato.getCodigo() == 1) {
                veditar = true;
                buscaReniec = true;
                guardarFuncionario = false;
                regeVali = "regexp=^[0-9]{8}$";
                maxlength = 8;
            } else {
                veditar = false;
                veditarCargo = false;
                buscaReniec = false;
                guardarFuncionario = true;
                buscarReniec = false;
                regeVali = "regexp=^[a-zA-Z0-9]{12}$";
                maxlength = 12;
            }
        } else {
            veditar = false;
            buscaReniec = false;
            guardarFuncionario = true;
            buscarReniec = false;
            regeVali = "";
            maxlength = 12;
            //ingresaDI = true;
        }
    }

    @Log
    public List<Funcionario> getFuncionario(Long tipoDocumento, String nrodocumento) {
        Criteria criterio = session.createCriteria(Funcionario.class);
        //criterio.add(Restrictions.eq("estado", true));
        criterio.add(Restrictions.eq("documentoidentidad.id", tipoDocumento));
        criterio.add(Restrictions.eq("nroDocumento", nrodocumento));
        return criterio.list();
    }

    @Log
    void onNroDocumentoChanged() {
        if (_request.getParameter("param") != null) {
            nuevofuncionario.setNroDocumento(_request.getParameter("param"));
        }
    }
}
